package ca.etsmtl.log720.lab1;

import java.io.*;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;

public class ClientVoiture {

	private static BanqueReactions _banqueReactions;
	private static BanqueDossiers _banqueDossiers;
	private static BanqueInfractions _banqueInfractions;

	public static void main(String[] args) {
		try {
			org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

			// get hold of the naming service
			NamingContextExt nc = NamingContextExtHelper.narrow(orb
					.resolve_initial_references("NameService"));

			NameComponent[] name_banqueReactions = new NameComponent[] { new NameComponent(
					"BanqueReactions", "service") };
			NameComponent[] name_banqueDossiers = new NameComponent[] { new NameComponent(
					"BanqueDossiers", "service") };
			NameComponent[] name_banqueInfractions = new NameComponent[] { new NameComponent(
					"BanqueInfractions", "service") };

			// resolve name to get a reference to our server
			_banqueReactions = BanqueReactionsHelper.narrow(nc
					.resolve(name_banqueReactions));
			
			_banqueDossiers = BanqueDossiersHelper.narrow(nc
					.resolve(name_banqueDossiers));
			_banqueInfractions = BanqueInfractionsHelper.narrow(nc
					.resolve(name_banqueInfractions));

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		boolean continuer = true;
		
		while(continuer) {
		
			System.out.println("\n\n---\nMenu du client de la voiture. Choisissez parmi les options disponibles :");
			System.out.println("1. Obtenir la liste des reactions possibles.");
			System.out.println("2. Selectionner une reaction pour l'ajouter au dossier selectionne.");
			System.out.println("3. Ajouter des reactions dans la banque de reactions.");
			System.out.println("4. Obtenir une liste de dossiers selon le nom et prenom, numero de plaque, ou numero de permis");
			System.out.println("5. Selectionner un dossier et visualiser son contenu.");
			System.out.println("6. Obtenir la liste des infractions possibles.");
			System.out.println("7. Selectionner une infraction pour l'ajouter au dossier selectionne.");
			System.out.println("8. Quitter l'application.");
			
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			int choice = 0;
			try {
				choice = Integer.parseInt(br.readLine());
			} catch (IOException err) {
				System.out.println("Error reading line");
			}
			
			switch (choice) {
				case 1 : visualiserReactions();
					break;
				case 2 : ajouterReactionAuDossier();
					break;
				case 3 : ajouterReactions();
					break;
				case 4 : visualiserDossiers();
					break;
				case 5 : visualiserDossier();
					break;
				case 6 : visualiserInfractions();
					break;
				case 7 : ajouterInfractionAuDossier();
					break;
				case 8 : continuer = false;
				System.out.println("\n\nExiting... Bye!\n");
			}
		
		}
	}

	/**
	 * Methode permettant d'obtenir la liste de reactions possibles
	 */
	public static void visualiserReactions() {
		System.out.println("\n\nVisualisation des reactions\n\n");
		
		CollectionReaction collectionReactions = _banqueReactions.reactions();
		System.out.println("");
		for (int i = 0; i < collectionReactions.size(); i++) {
			System.out.println("\n"+collectionReactions.getReaction(i)._toString()+"\n---");
		}
		System.out.println("");
	}

	/**
	 * Methode permettant d'ajouter une reaction pour l'ajouter au dossier
	 * selectionne
	 */
	public static void ajouterReactionAuDossier() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			try {
				System.out.println("Choisissez le dossier auquel vous voulez ajouter une reaction");
				System.out.println("id dossier : ");
				int idDossier = Integer.parseInt(br.readLine());
				System.out.println("Choisissez la reaction a ajouter au dossier selectionne");
				System.out.println("id reaction : ");
				int idReaction = Integer.parseInt(br.readLine());
				_banqueDossiers.ajouterReactionAuDossier(idDossier, idReaction);
			} catch (IOException err) {
				System.out.println("Error reading line");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Methode permettant d'ajouter des reactions dans la banque de reactions
	 */
	public static void ajouterReactions() {
		try {
			System.out.println("Ajout d'une reaction dans la banque de reactions");
			System.out.println("Rentrez les elements suivants:");
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			try {
				System.out.print("\nreaction : ");
				String desc = br.readLine();
				System.out.print("\ngravite : ");
				int gravite = Integer.parseInt(br.readLine());
				_banqueReactions.ajouterReaction(desc, gravite);
			} catch (IOException err) {
				System.out.println("Error reading line");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Methode permettant d'obtenir une liste de dossiers selon le nom et
	 * prenom, numero de plaque, ou numero de permis
	 */
	public static void visualiserDossiers() {
		System.out.println("Choisissez une option de visualisation des dossiers : ");
		System.out.println("1. Par nom");
		System.out.println("2. Par numero de plaque");
		System.out.println("3. Par numero de permis");

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int choice = 0;
		try {
			choice = Integer.parseInt(br.readLine());
		} catch (IOException err) {
			System.out.println("Error reading line");
		}
		CollectionDossier collectionDossiers = null;
		switch (choice) {
			case 1 : 
				try {
					System.out.print("\nNom : ");
					String nom = br.readLine();
					System.out.print("\nPrenom : ");
					String prenom = br.readLine();
					collectionDossiers = _banqueDossiers.trouverDossiersParNom(nom, prenom);
				} catch (IOException err) {
					System.out.println("Error reading line");
				}
				break;
			case 2 : 
				try {
					System.out.print("\nno Plaque : ");
					String noPlaque = br.readLine();
					collectionDossiers = _banqueDossiers.trouverDossiersParPlaque(noPlaque);
				} catch (IOException err) {
					System.out.println("Error reading line");
				}
				
				break;
			case 3 :
				try {
					System.out.print("\nno Permis : ");
					String noPermis = br.readLine();
					afficherDossierComplet(_banqueDossiers.trouverDossierParPermis(noPermis));
				} catch (IOException err) {
					System.out.println("Error reading line");
				}
				break;
		}
		if(collectionDossiers != null) {
			System.out.println("\n\nAffichage de la liste des dossiers.\n---------------------\n");
			for (int i = 0; i < collectionDossiers.size(); i++) {
				afficherDossierComplet(collectionDossiers.getDossier(i));
			}
		}
	}
	
	/**
	 * Methode permettant de selectionner un dossier et visualiser son contenu
	 */
	public static void visualiserDossier() {
		System.out.println("Rentrez l'identifiant du dossier a visualiser :");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			int id = Integer.parseInt(br.readLine());
			afficherDossierComplet(_banqueDossiers.trouverDossierParId(id));
		} catch (IOException err) {
			System.out.println("Error reading line");
		}
	}

	
	/**
	 * Methode permettant d'obtenir la liste d'infractions possibles
	 */
	public static void visualiserInfractions() {
		CollectionInfraction collectionInfractions = _banqueInfractions.infractions();
		for (int i = 0; i < collectionInfractions.size(); i++) {
			System.out.println(collectionInfractions.getInfraction(i)._toString());
		}
	}

	/**
	 * Methode permettant de selectionner une infraction pour l'ajouter au
	 * dossier selectionne
	 */
	public static void ajouterInfractionAuDossier() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			try {
				System.out.println("Choisissez le dossier auquel vous voulez ajouter une infraction");
				System.out.println("id dossier : ");
				int idDossier = Integer.parseInt(br.readLine());
				System.out.println("Choisissez l'infraction a ajouter au dossier selectionne");
				System.out.println("id infraction : ");
				int idInfraction = Integer.parseInt(br.readLine());
				_banqueDossiers.ajouterInfractionAuDossier(idDossier, idInfraction);
			} catch (IOException err) {
				System.out.println("Error reading line");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static void afficherDossierComplet(Dossier dossier) {

		System.out.println(dossier._toString());
		
		System.out.println("\nListe des infractions:");
		for(int i : dossier.getListeInfraction()) {
			System.out.println(_banqueInfractions.infractions().getInfraction(i)._toString());
		}
		System.out.println("");
		System.out.println("\nListe des reactions:");
		for(int i : dossier.getListeReaction()) {
			System.out.println(_banqueReactions.reactions().getReaction(i)._toString());
		}
		System.out.println("");
	}
}
